package ru.compft.common.services.impl;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Service;
import ru.compft.common.dao.DictionaryDao;
import ru.compft.common.dao.TermDao;
import ru.compft.common.data.Dictionary;
import ru.compft.common.data.Term;
import ru.compft.common.services.DictionariesService;
import ru.compft.common.services.SystemService;

import javax.annotation.Resource;
import java.util.List;

/**
 * User: VVasiliev
 * Date: 14.06.12
 * Time: 14:03
 * Реализация сервиса работы со словарями
 * Если кеш инициализирован, читаем из него, если нет - пробуем проинициализировать и прочитать.
 */
@Service
public class DictionariesServiceImpl implements DictionariesService {
    private static final Logger logger = LoggerFactory.getLogger(DictionariesServiceImpl.class);

    @Resource(name = "dictionaryDao")
    private DictionaryDao dictionaryDao;

    @Resource(name = "termDao")
    private TermDao termDao;

//    @Resource(name = "dictionaryCache")
//    private DictionaryCache dictionaryCache;

//    @Resource(name = "termCache")
//    private TermCache termCache;

    @Resource(name = "systemService")
    private SystemService systemService;

    @Override
    public List<Dictionary> getAllDictionaries() {
        // Преинициализация
//        preInit();

        // Если кеш проинициализирован, читаем из него, если все еще нет, читаем из DAO 
//        if (dictionaryCache.isInitialised()) {
//            return dictionaryCache.getValues();
//        } else {
            return dictionaryDao.getAllDictionaries();
//        }
    }

    @Override
    public List<Dictionary> getDictionaries(int from, int count) {
        // Преинициализация
//        preInit();

        // Если кеш проинициализирован, читаем из него, если все еще нет, читаем из DAO 
//        if (dictionaryCache.isInitialised()) {
//            return CommonUtils.getPartOfList(from, count, dictionaryCache.getValues());
//        } else {
            return dictionaryDao.getDictionaries(from, count);
//        }
    }

    @Override
    public int countAllDictionaries() {
        // Преинициализация
//        preInit();

        // Если кеш проинициализирован, читаем из него, если все еще нет, читаем из DAO 
//        if (dictionaryCache.isInitialised()) {
//            return dictionaryCache.countSize();
//        } else {
            return dictionaryDao.countAllDictionaries();
//        }
    }

    @Override
    public Dictionary getDictionaryByCode(String code) {
        // Преинициализация
//        preInit();

        // Если кеш проинициализирован, читаем из него, если все еще нет, читаем из DAO
//        if (dictionaryCache.isInitialised()) {
//            return dictionaryCache.getCodeToDictionaryMap().get(code);
//        } else {
            return dictionaryDao.getDictionaryByCode(code);
//        }
    }

    @Override
    public Dictionary getDictionaryById(Long id) {
        // Преинициализация
//        preInit();

        // Если кеш проинициализирован, читаем из него, если все еще нет, читаем из DAO
//        if (dictionaryCache.isInitialised()) {
//            return dictionaryCache.getIdToDictionaryMap().get(id);
//        } else {
            return dictionaryDao.getDictionaryById(id);
//        }
    }

    @Override
    public List<Term> getAllTerms() {
        // Преинициализация
//        preInit();

        // Если кеш проинициализирован, читаем из него, если все еще нет, читаем из DAO
//        if (termCache.isInitialised()) {
//            return termCache.getTermList();
//        } else {
            return termDao.getAllTerms();
//        }
    }

    @Override
    public List<Term> getTerms(int from, int count) {
        // Преинициализация
//        preInit();

        // Если кеш проинициализирован, читаем из него, если все еще нет, читаем из DAO
//        if (termCache.isInitialised()) {
//            return CommonUtils.getPartOfList(from, count, termCache.getTermList());
//        } else {
            return termDao.getTerms(from, count);
//        }


    }

    @Override
    public int countAllTerms() {
        // Преинициализация
//        preInit();

        // Если кеш проинициализирован, читаем из него, если все еще нет, читаем из DAO
//        if (termCache.isInitialised()) {
//            return termCache.getTermList().size();
//        } else {
            return termDao.countAllTerms();
//        }
    }

    @Override
    public boolean createTerm(Term term) {
        if (term == null) return false;

        // генерируем новый ID
//        term.setId(termDao.generateId());

        // сохраняем в БД
        boolean saveResult = termDao.createTerm(term);

//        if (saveResult) {
//            // сохраняем в кеше
//            termCache.createTerm(term);
//        }
        return saveResult;
    }

    /**
     * Преинициализация кеша, если это необходимо
     */
//    private void preInit() {
//        // Если стоит системное свойство "использовать кеш" и если кеш не проинициализирован, то инициализируем его из DAO
//        if (systemService.isUseCache()) {
//            if (!dictionaryCache.isInitialised()) {
//                dictionaryCache.initFromList(dictionaryDao.getAllDictionaries());
//            }
//
//            if (!termCache.isInitialised()) {
//                termCache.initFromList(termDao.getAllTerms());
//            }
//        } else {
//            // очищаем кеш
//            dictionaryCache.clearRecords();
//            termCache.clearRecords();
//        }
//    }
}
